/*
 记录异步命令执行状态的文件格式如下：
 
 key1,value1
 key2,value2
 key3,value3
 写入时，key根据value得到md5值，再作为Key写入。写入时一直追加
 

 Authors: ZhangXuelian
          HeXianCong
 
 Changes:
 	
	

 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

#define CONFIG_MAX_LINE    1024

/* C90 不支持布尔类型变量，手工定义。 */

#ifndef MY_BOOLEAN_H
#define MY_BOOLEAN_H

#define false 0
#define true 1
//typedef int bool;
#endif

/* Finish macro boolean definition */


/* 全局互斥锁 */
pthread_mutex_t mutex;

/*  coe_write 将一个key，value对写入文件
    打开模式为不覆盖。
*/

void coe_write(const char *filename, const int key, const char *value)
{
 //   pthread_mutex_lock(&mutex);
 //   // 添加上当前路径
	//// .....

	//char buf[CONFIG_MAX_LINE+1];
 //   /* Load the file content */
 //   FILE * fp = NULL;
 //   if ((fp = fopen(filename,"a+")) == NULL)
 //   {
 //       printf("Fatal error, can't open config file '%s'\n", filename);
 //       pthread_mutex_unlock(&mutex);
 //       return;
 //   }
 //   //unsigned int count = 
	//snprintf(buf, CONFIG_MAX_LINE, "%d,%s\n", key,value);
 //   fwrite(buf,sizeof(char),strlen(buf),fp);
 //   fclose(fp);
 //   pthread_mutex_unlock(&mutex);
 //   return;
}

/*  coe_read 从日志中找到一个key对应的值，并将其赋值给value。
 若该值不存在则不做操作。
 value内存需提前分配好。
 */

void coe_read(const char *filename, const char *key, char *value)
{
    //pthread_mutex_lock(&mutex);
    //char buf[CONFIG_MAX_LINE+1];
    ///* Load the file content */
    //unsigned long key_len = strlen(key);
    //FILE * fp = NULL;
    //if ((fp = fopen(filename,"r")) == NULL)
    //{
    //    printf("Fatal error, can't open config file '%s'\n", filename);
    //    pthread_mutex_unlock(&mutex);
    //    return;
    //}
    //void *res;
    //int temp;
    //
    //while ((res = fgets(buf, CONFIG_MAX_LINE+1, fp)) != NULL) {
    //    if ((temp = strncmp(key, buf, key_len)) == 0) {
    //        break;
    //    }
    //}
    //memcpy((void*)value,(void*)(buf+key_len+1),strlen(buf)-key_len-1);
    //pthread_mutex_unlock(&mutex);
    //fclose(fp);
    //return;
}
/* 	coe_delete 删除一条记录。
	若该记录不存在则退出并提示。
	若记录存在，则删除并复写入原文件。
 */
void coe_delete(const char *filename, const char *key )
{
    //pthread_mutex_lock(&mutex);
    //char buf[CONFIG_MAX_LINE+1];
    ///* Stream through file */
    //unsigned long key_len = strlen(key);
    //FILE *fp = NULL;
    //if ((fp = fopen(filename, "rb+")) == NULL) {
    //    printf("Fatal error, can't open config file '%s'\n", filename);
    //    pthread_mutex_unlock(&mutex);
    //    return;
    //}
    //long _byte_num = 0, temp = 0;
    //void *res;
    //
    //while ((res = fgets(buf, CONFIG_MAX_LINE+1, fp)) != NULL) {
    //    if ((temp = strncmp(key, buf, key_len)) != 0) {
    //        _byte_num += strlen(buf);
    //    } else {
    //        break;
    //    }
    //}
    //
    //if (res) {
    //    /* Get rest */
    //    unsigned long file_size = 0, buf_size = 0, current = 0;
    //    current = ftell(fp);
    //    if (fseek(fp, 0, SEEK_END) != 0) {
    //        perror("fseek");
    //    }
    //    file_size = ftell(fp);
    //    buf_size =  file_size - current;
    //    /* Rem 保存文件剩下字节 */
    //    char *rem = (char *)malloc(sizeof(char) * buf_size);
    //    if (fseek(fp, current, SEEK_SET) != 0) {
    //        perror("fseek");
    //    }
    //    fread(rem, sizeof(char), buf_size, fp);
    //    
    //    /* Prev 保存文件之前字节 */
    //    char* prev = (char*)malloc(sizeof(char) * file_size);
    //    if (fseek(fp, 0, SEEK_SET) != 0) {
    //        perror("fseek");
    //    }
    //    fread(prev, sizeof(char), _byte_num, fp);
    //    fclose(fp);
    //    
    //    /* 将两段字节拼接并写入原文件 */
    //    
    //    strncat(prev, rem, buf_size);
    //    if ((fp = fopen(filename, "w+")) == NULL) {
    //        perror("fopen");
    //    }
    //    
    //    if (fwrite(prev, sizeof(char), strlen(prev), fp) == 0) {
    //        perror("fwrite");
    //    }
    //    printf("Successfully deleted key: %s\n", key);
    //    printf("New file is saved under filename: %s\n", filename);
    //    
    //    /* 释放内存 */
    //    free(rem);
    //    free(prev);
    //} else {
    //    printf("Key not found: %s\n", key);
    //}
    //
    //pthread_mutex_unlock(&mutex);
    //return;
}

/**
 * 这里用于读取 manufacturer_license 和 device_serial_number_license
 * 设备厂商在生产设备时，可以在出厂测试的时候，把这两个值，写入到设备的某个地方，而不需要修改程序。
 */

bool read_buffer(char * filename, unsigned char * buf, int size, int * size_used)
{
    if (!filename || !buf)
        return false;
    
    int len = 0;
    FILE * file = fopen(filename, "rb");
    if (!file)
        return false;
    
    fseek(file, 0L, SEEK_END);
    len = ftell(file);
    fseek(file, 0L, SEEK_SET);
    
    if (0 == len || size < len)
    {
        printf("invalide file or buffer size is too small...\n");
        return false;
    }
    *size_used = fread(buf, 1, len, file);
    fclose(file);
    return true;
}

#ifdef MY_COE_READ_TEST
int main() {
    FILE *fp;
    char *filename = "test123";
    char value[32];
    char key[2] = "1";
    // for (int i = 0; i < 2; ++i) {
    //     coe_write(filename, i, "so");
    // }
    coe_read(filename, key, value);
    printf("%s", value);
    return 0;
}
#endif


